社会科学ためのDocker入門

レプリケーション駆動な研究のために

August 31, 2023

レプリケーション駆動な研究

なぜ彼のコードは私のPCで動かないのか

バーチャルマシンとレプリケーション

Dockerの利用例

LinuxとDockerの基礎

Linuxとは

  • 狭義: Linuxカーネルのこと
    • OSの基礎的な機能を提供するライブラリ群
  • 広義: Linuxカーネルを採用したOS
    • コマンドやライブラリなどの違いによってディストリビューションに分かれる

Linuxディストリビューション

  • 主にDebian系, RedHat系, その他独立系に分かれる
    • Debian: Ubuntu, Raspberry Pi
    • RedHat: CentOS, Amazon Linux
    • 独立系: Chrome, Android, Arch, Alpine
  • Docker用としてはUbuntuがおすすめ

Dockerの仕組み

Docker コンテナ

  • 1つのマシンのように振る舞う仮想環境
  • ホストOSとカーネルをシェアする
  • ホストもコンテナもLinux OS

仮想化ソフトとの違い

  • 仮想化ソフトはホスト上のソフトウェア
  • ゲストOSをエミュレートして動作する
  • ホストもゲストもLinuxの必要はない
  • 仮想化ソフト上のマシンは遅くなる


イメージとレジストリ

Docker イメージ

  • コンテナの元となるテンプレート
  • USER/IMAGE:TAG で指定する. TAGを省略するとlatestが指定される

Docker レジストリ

  • イメージを保存する場所
  • 基本的にはDocker Hubを用いる.
    • Officialイメージ (ubuntu, rocker, node, jupyter, etc.)
    • 自作イメージをアップロードもできる
  • その他, GitHub Container Registry, Amazon Elastic Container Registry など

Handson: 初めてのDocker & Linux

Ubuntu環境の構築

  1. Docker Desktopが起動していることを確認 (のマーク)
  2. ターミナルで以下のコマンドを実行
docker run -it ubuntu:20.04 bash

docker run: Dockerコンテナを起動するコマンド. 以下のオプションを指定

  • -it: コンテナの標準入出力をターミナルにつなぐ
    • 省略するとバックグラウンドでコンテナが起動し, ホスト側からは何も見えない.
  • ubuntu:20.04: Ubuntu 20.04のイメージを指定
    • 初めての場合は自動的にDocker Hubからイメージをダウンロードする
  • bash: コンテナ内でbashを起動する
    • このコマンドを省略すると, コンテナ内で何も起動せずに終了する

初めてのLinux

  1. 以下の基本コマンドを実行してみよう
    • ls: ディレクトリ内のファイルを表示
    • pwd: 現在のディレクトリを表示
    • cd: ディレクトリを移動
    • mkdir: ディレクトリを作成
  2. パッケージをダウンロードしてみよう
apt update && apt install -y git
  • apt update: パッケージリストを更新.
  • apt install: パッケージをインストール
    • -y: インストール時の確認を省略

Dockerfile

  • 既存のDockerイメージに必要なソフトやパッケージを追加して新しいイメージを作成する設計図
  • 拡張子がないことに注意
FROM ubuntu:20.04

ENV DEBIAN_FRONTEND noninteractive

RUN apt update && apt install -y git

CMD ["bash"]
  • FROM: ベースとなるイメージを指定
  • ENV: 環境変数を設定
  • RUN: シェルコマンドを実行
  • CMD: コンテナ起動時に実行するコマンド
    • 指定しないと起動後に終了する
dockr build .

ユーザとパーミッション

Dockerでは通常, rootユーザでコンテナが起動する

  • Docker上で作業したファイルがroot権限で作成される
  • LinuxとWSL2ユーザーはホスト側からファイルにアクセスできなくなる

Left column

FROM ubuntu:20.04

ENV SHELL /bin/bash
ENV DEBIAN_FRONTEND noninteractive

RUN apt update && apt install -y git

ARG USERNAME=vscode
ARG USER_UID=1000
ARG USER_GID=$USER_UID

RUN groupadd --gid $USER_GID $USERNAME &&
  useradd --uid $USER_UID --gid $USER_GID -m $USERNAME

USER $USERNAME

CMD ["bash"]

R on Docker

rockerプロジェクト

  • rockerはオフィシャルのRイメージ群
  • 私はRのパッケージはキャッシュするので, rocker/rstudioまたはrocker/geospatialを使うことが多い


イメージ ベースイメージ 概要
rocker/r-ver ubuntu Ubuntu + R
rocker/rstudio rocker/r-ver + RStudio Server
rocker/tidyverse rocker/rstudio + tidyverse & devtools
rocker/verse rocker/tidyverse + tinytex & 組版関係のパッケージ
rocker/geospatial rocker/geospatial + 地理情報用パッケージ

ポートフォワーディング

マウント

docker-compose.yml

Rパケージのインストール

Docker with VSCode

Remote Development

Handson: kazuynagimoto/dockerR

発展: SSH通信

発展: Git in Docker container

発展: VSCode SSH

発展: Docker on AWS

Practical Guide for Replicable Environment

Docker Desktop for Windows/Mac

DockerはLinux上の技術

  • Docker Desktop for Windows/Macでは, 仮想マシン上のLinuxを用いてDockerを使う
  • WindowsはWSL2という軽量かつ高速なLinuxエミュレータを用いる
  • Mac上のDockerは一般にLinux上のDockerよりも数段遅くなる

ファイルシステムの違い

  • Windows/Mac上のファイルをDocker (Linux) で用いようとするとファイルの変換作業が必要
  • Windowsの場合はWSL2の領域でファイルを保存すれば解決する
  • Macの場合は長らく解決策がなかったが, virtiofsという新しいファイルシステムを用いることで高速化した (らしい)